package org.abettor.angleworm.db.ext;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Enumeration;
import java.util.Properties;

import org.sqlite.JDBC;

/**
 * 由于当前版本的 org.sqlite.JDBC 对 JDBC 的实现还没有完全完成，
 * 导致 hibernare.hbm2ddl.auto=update 时出现异常，同时自动更新数据库结构失败。
 * 为了解决这一问题，建立本 JDBC 驱动类，用以实现本项目中某些必要的接口。
 * @author shawn
 *
 */
public class Driver extends JDBC
{
	static
	{
        try
        {
        	//	先注册自己
            DriverManager.registerDriver(new Driver());

            //	再无耻的反注册 org.sqlite.JDBC，防止发生争抢
            Enumeration<java.sql.Driver> drivers = DriverManager.getDrivers();
            while(drivers.hasMoreElements())
            {
            	java.sql.Driver driver = drivers.nextElement();
            	if(driver.getClass().getName().equals(JDBC.class.getName()))
            	{
                    DriverManager.deregisterDriver(driver);
            	}
            }
        }
        catch (SQLException e)
        {
            e.printStackTrace();
        }
    }

	/**
	 * 这里不直接返回 org.sqlite.JDBC 的 Connection 接口实例，
	 * 而是在其外边给他套个马甲，除需要进行改动的地方外，都沿用 org.sqlite.JDBC 中的方法即可。
	 * <b>注意这里之所以不去继承 org.sqlite.Conn 类，是因为它有 default 访问修饰符，烦！</b>
	 */
	@Override
	public Connection connect(String url, Properties info) throws SQLException
	{
		Connection conn = super.connect(url, info);
		return new ConnectionAdaptor(conn);
    }
}
